iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 14

Day14. django與database的橋樑~

  • 分享至 

  • xImage
  •  

前言

昨天我們看到了migrate一開始會去拿到相對應的connection物件也就是DatabaseWrapper,而拿到這個connection後具體要做什麼呢?今天就讓我們繼續往下捕捉migrate的動向!

正題

接續昨天的位置,今天會從MigrationExecutor開始~
https://ithelp.ithome.com.tw/upload/images/20230929/20162905S7rmo4ymkk.png

https://ithelp.ithome.com.tw/upload/images/20230929/20162905Ka4cs4Ieez.png
這邊看到原本的connection又分別丟給了MigrationLoaderMigrationRecorder兩個class,看一下他們init時分別會做什麼事吧!
先從Loader開始
https://ithelp.ithome.com.tw/upload/images/20230929/20162905VV6aayPqbm.png
https://ithelp.ithome.com.tw/upload/images/20230929/20162905bROmG3JGhw.png
看註解,Loader會把分別在disk和database中的migration files load進來後進行操作~看來會分別和disk和databse做連接
接著看到最後一行self.build_graph()建立圖表?來看看這是在做什麼~
https://ithelp.ithome.com.tw/upload/images/20230929/20162905xRaBVjYRku.png
哦!看來是把migrations中的disk和database的data存到MigrationGraph中!
不過我們還是一個一個擊破!
首先是
https://ithelp.ithome.com.tw/upload/images/20230929/20162905tILlK7A1W4.png
https://ithelp.ithome.com.tw/upload/images/20230929/20162905b6QIqG9R8X.png
會把我們在settings.pyINSTALLED_APPS的每個app中的migrations讀取進來,下面做了一些檔案的操作會把在app中的migrations裡面的py檔的Migration丟進dict存著
https://ithelp.ithome.com.tw/upload/images/20230929/20162905D7FYNNPLYM.png
接著我們回到build_graph往下
接下來是load database data
https://ithelp.ithome.com.tw/upload/images/20230929/20162905Zv1JTj4hzn.png
MigrationRecorder前面好像也要看到,這邊不止new出來還call了applied_migrations從function名字我們也可以很輕易的了解他想做什麼了~我們進去看看這個function做了什麼事吧!
https://ithelp.ithome.com.tw/upload/images/20230929/20162905R4DAgecEKL.png
再往裡看has_table()
https://ithelp.ithome.com.tw/upload/images/20230929/20162905O4BQg3TV2s.png
哦!!這裡的connection是誰還記得嗎!是sqlite3中的DatabaseWrapper看看cursor做了什麼~
我們可以在他的父類別BaseDatabaseWrapper找到,而with的原理需要google看文章了!提供一篇
https://ithelp.ithome.com.tw/upload/images/20230929/20162905QLlHXBbvlH.png
再往裡
https://ithelp.ithome.com.tw/upload/images/20230929/20162905vplXqOjakV.png
一樣一個一個看
https://ithelp.ithome.com.tw/upload/images/20230929/20162905scDTdk0Afm.png
看註解就可以知道會關掉有問題的連線~
往下移動
https://ithelp.ithome.com.tw/upload/images/20230929/20162905SmBcog5lEX.png
https://ithelp.ithome.com.tw/upload/images/20230929/20162905tLNFjUPYVV.png
這邊的self.wrap_database_errors又是什麼呢?
https://ithelp.ithome.com.tw/upload/images/20230929/20162905mIEsE1YERe.png
https://ithelp.ithome.com.tw/upload/images/20230929/20162905QR29noxH4c.png
這邊有些with的相關用法~先暫時把他理解為處理過程中遇到error的地方吧~
我們在回到ensure_connection()的下一個self.connect()
https://ithelp.ithome.com.tw/upload/images/20230929/20162905yYLJ0bv5yD.png
我們先把目標放在self.get_new_connection()這個function!
這邊要回到sqlite3的DatabaseWrapper
https://ithelp.ithome.com.tw/upload/images/20230929/201629055Yrt5blnLT.png
終於是看到連接database的地方啦!!
https://ithelp.ithome.com.tw/upload/images/20230929/20162905MUmQoGHTpl.png
這個就是django/python跟sqlite3溝通的地方了!有機會再看看更底層連接的C語言吧~這個DB-API相關規範也都有寫在python的文件裡面!
接著再回到_cursor()
https://ithelp.ithome.com.tw/upload/images/20230929/20162905HQYdYeIsf7.png
然後今天就先停在這邊吧!明天我們再接著繼續!!
https://ithelp.ithome.com.tw/upload/images/20230929/20162905AdRiypzjVx.png
現在停在紅色那點~

結語

稍微看一下今天的關鍵字

  • sqlite3 dbapi2
  • with 原理
  • disk 和 database 的graph(還沒看到)

migrate真的是很龐大,也終於是找到django和database的橋樑啦!!不過詳細的運作邏輯還是得去看python的原始碼看看python sqlite C 這三個怎麼串接的!不過我們這次主題是django這邊就不寫在鐵人賽了~


上一篇
Day13. migrate 資料庫遷移?
下一篇
Day15. django中的graph!
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言